package com.lcy.lambda.function;

import java.util.function.Function;
import java.util.function.IntConsumer;

/**
 * 再来两个复杂点的函数式接口认识lambda和泛型
 * @author lcy
 * @date 2024/8/15 15:41
 */
public class Demo3 {

    /**
     * Function<T, R>  其中T是方法R apply(T t)的入参类型，R是apply返回值类型，Function是最常用的一个函数式接口
     * @param function
     * @param <R>
     * @return
     */
    public static <R> R typeConver(Function<String,R> function){
        String str = "1235";
        R result = function.apply(str);
        return result;
    }

    /**
     * IntConsumer接口提供的accept(int value)方法是对某个整形进行处理，没有返回值
     * @param consumer
     */
    public static void foreachArr(IntConsumer consumer){
        int[] arr = {1,2,3,4,5,6,7,8,9,10};
        for (int i : arr) {
            consumer.accept(i);
        }
    }

    public static void main(String[] args) {
        //把String类型转为Long
        //匿名内部类
        Long a = typeConver(new Function<String, Long>() {
            @Override
            public Long apply(String s) {
                return Long.valueOf(s);
            }
        });
        System.out.println(a);

        //最复杂lambda
        Long b = typeConver((String s) ->  {
            return Long.valueOf(s);
        });
        System.out.println(b);
        //最简lambda
        Long c = typeConver(s -> Long.valueOf(s));
        System.out.println(c);
        //=================================================
        //匿名内部类
        foreachArr(new IntConsumer() {
            @Override
            public void accept(int value) {
                System.out.println(value * 2);
            }
        });
        //最复杂lambda
        foreachArr((int value) -> {System.out.println(value - 1);});
        //最简lambda
        foreachArr(value -> System.out.println(value - 1));

    }


}
